package pos.data;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import pos.domain.Regalo;
import pos.domain.Usuario;

public class JDBCRegaloDAO implements IRegaloDAO{

	Connection conn = ConnectionManager.getInstance().getConn();

	@Override
	public List<Regalo>selectAllRegalos() {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Regalo r = null;
		String sql = "SELECT * FROM regalo where unidades>0";
		List<Regalo> lista = new ArrayList<Regalo>();

		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();

			while (result.next()) {
				r = new Regalo();
				r.setNombre(result.getString("nombre"));
				r.setDescripcion(result.getString("descripcion"));
				r.setExistencias(result.getInt("unidades"));
				r.setIdRegalo(result.getInt("idRegalo"));
				r.setPuntos(result.getInt("puntosNecesarios"));
				
				lista.add(r);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return lista;
	}

	@Override
	public void cajearRegalo(Regalo regalo, Usuario usuario) {
		insertAsignacion(regalo, usuario);
		JDBCUsuarioDAO userDao = new JDBCUsuarioDAO();
		int puntos = regalo.getPuntos()*(-1);
		userDao.updatePuntos(usuario, puntos);
		reduceExistencias(regalo);
		
	}
	
	private void insertAsignacion(Regalo regalo, Usuario usuario){
		String sql = "INSERT INTO asignacionregalo (idRegalo, idUsuario,fecha) VALUES (?,?,?) ";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, regalo.getIdRegalo());
			stmt.setInt(2, usuario.getIdUsuario());
			java.util.Date fecha = new java.util.Date();
			Date fechaSQL = new Date(fecha.getYear(), fecha.getMonth(), fecha.getDay());
			stmt.setDate(3, fechaSQL);
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
	}
	
	private void reduceExistencias(Regalo regalo){
		String sql = "update regalo set unidades = unidades - ? where idRegalo = ?";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			
			stmt.setInt(1, 1);
			stmt.setInt(2, regalo.getIdRegalo());
		
			stmt.executeUpdate();

		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}	
	}

	@Override
	public Regalo selectById(int idRegalo) {
		PreparedStatement stmt = null;
		ResultSet result = null;
		Regalo r = null;
		String sql = "SELECT * FROM regalo where idRegalo = ?";

		try {
			stmt = conn.prepareStatement(sql);
			stmt.setInt(1, idRegalo);
			result = stmt.executeQuery();

			if (result.next()) {
				r = new Regalo();
				r.setNombre(result.getString("nombre"));
				r.setDescripcion(result.getString("descripcion"));
				r.setExistencias(result.getInt("unidades"));
				r.setIdRegalo(result.getInt("idRegalo"));
				r.setPuntos(result.getInt("puntosNecesarios"));
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return r;
	}
		
}
	
